package com.blog.cloud.auth.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.blog.cloud.api.dto.UserInfoDTO;
import com.blog.cloud.api.utils.R;
import com.blog.cloud.auth.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

import java.util.List;

/**
 * 用户表(User)表控制层
 *
 * @author 龙茶清欢
 * @since 2024-08-15 19:51:58
 */
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
@Tag(name = "用户表管理", description = "用户表管理")
public class UserController {

    private final UserService userService;

    /**
     * 查询
     * PathVariable 从URL路径中获取参数
     * URL 形式：/user/findById/{userId}
     */
    @Operation(summary = "通过ID查询")
    @GetMapping("/findById/{userId}")
    public R<Object> findById(@PathVariable Long userId) {
        return R.ok(userService.getById(userId));
    }

    /**
     * 单条件查询数据
     * RequestParam 从URL的查询字符串中获取参数
     * URL 形式：/user/delete?idList=1,2,3
     */
    @Operation(summary = "删除")
    @DeleteMapping("/delete")
    public R<Object> findByParam(@RequestParam("idList") List<Long> idList) {
        return R.ok(userService.removeByIds(idList));
    }

    /**
     * 多条件查询数据
     * 从URL的查询字符串中获取参数，@RequestParam
     * <p>
     * URL 形式：/user/products?sortField=name&sortOrder=asc
     * @param sortOrder 主键结合
     * @return 删除结果
     */
    @GetMapping("/products")
    public R<Object> getProductsSorted(
            @RequestParam(defaultValue = "name") String sortField,
            @RequestParam(defaultValue = "asc") String sortOrder) {
        System.out.println("sortField: " + sortField + ", sortOrder: " + sortOrder);
        return R.ok();
    }

    /**
     * 新增数据
     *
     * @param user 实体对象
     * @return 新增结果
     */
    @Operation(summary = "新增")
    @PostMapping("/insert")
    public R<Object> insert(@RequestBody UserInfoDTO user) {
        return R.ok(userService.save(user));
    }

    /**
     * 修改数据
     *
     * @param user 实体对象
     * @return 修改结果
     */
    @Operation(summary = "修改")
    @PutMapping("/update")
    public R<Object> update(@RequestBody UserInfoDTO user) {
        return R.ok(userService.updateById(user));
    }

    /**
     * 删除数据
     *
     * @param idList 主键结合
     * @return 删除结果
     */
    @Operation(summary = "删除")
    @DeleteMapping("/delete")
    public R<Object> delete(@RequestParam("idList") List<Long> idList) {
        return R.ok(userService.removeByIds(idList));
    }

    /**
     * 分页查询
     * GetMapping 可以直接接收 URL 查询字符串中的参数。不使用 @RequestParam 等注解。
     * 分页参数（如 page 和 size）和过滤条件（如 username 和 age）都可以通过 URL 查询字符串传递。
     * Spring MVC 会自动将这些参数映射到相应的对象上。
     */
    @Operation(summary = "分页查询")
    @GetMapping("/findByPage")
    public R<Object> findByPage(Page<UserInfoDTO> page, UserInfoDTO userInfoDTO) {
        return R.ok(userService.page(page, new QueryWrapper<>(userInfoDTO)));
    }
}

// 关于 Servlet Web 应用程序的开发配置参考 SpringBoot 官方文档： https://docs.spring.io/spring-boot/reference/web/servlet.html